'use strict';

const sjcl = require('sjcl');
const CryptoJS = require('crypto-js');
const NodeRSA = require('node-rsa');


// 通用工具函数
// 所有的工具函数都放置在此，做好命名规范，加上前缀
module.exports = {
  // 通用的以 helper 开头
  helperDemo(data) {
    return data;
  },
  // 校验相关的工具函数以 check 开头
  checkDemo(data) {
    return data;
  },
  // 校验链上的备注的长度，最大长度需要小于1019
  checkMemoLength(str) {
    if (!str) {
      return true;
    }
    const buffer = Buffer.from(str, 'utf-8');
    if (buffer.length < 1020) {
      return true;
    }
    return false;
  },
  // 格式转换相关的工具函数以 format 开头
  formatDemo(data) {
    return data;
  },
  // 正则相关的工具函数以 regular 开头
  /**
   * 正则校验用户名
   * @param { String } username 需要正则校验的用户名
   * @return { Boolean } 返回通过与否
   */
  regulartestUserName(username) {
    const result = /^[A-Za-z0-9_-]{3,15}$/.test(username);
    return result;
  },
  /**
   * 正则校验手机号
   * @param { String } phone 需要正则校验的手机号
   * @return { Boolean } 返回通过与否
   */
  regulartestPhoneNumber(phone) {
    const result = /^1(3|4|5|6|7|8|9)\d{9}$/.test(phone);
    return result;
  },
  // 安全相关的工具函数，如加密解密以security开头
  securityDemo(data) {
    return data;
  },
  /**
   * 加密用户名用sjcl算法
   * @param { String } username 需要加密的用户名
   * @return { String } 返回加密后的结果
   */
  securityUserName(username) {
    const result = sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(username.toLowerCase()));
    return result;
  },
  /**
   * DES加密数据,用于注册用登录用户名和密码加密
   * @param { String } data 需要加密的数据
   * @return { String } 结果
   */
  securityDesEncrypt(data) {
    const content = '^%#$#$fdlfdsahjl01643fdafXLdaf&^%&%#$@';
    const keyHex = CryptoJS.enc.Utf8.parse(content);
    const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    });
    return encrypted.toString();
  },
  /**
   * DES解密数据，对应方法 securityDesEncrypt
   * @param { String } data 需要加密的数据
   * @return { String } 结果
   */
  securityDesDecrypt(data) {
    const content = '^%#$#$fdlfdsahjl01643fdafXLdaf&^%&%#$@';
    const keyHex = CryptoJS.enc.Utf8.parse(content);
    const decrypted = CryptoJS.DES.decrypt({
      ciphertext: CryptoJS.enc.Base64.parse(data),
    }, keyHex, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    });
    const result = decrypted.toString(CryptoJS.enc.Utf8);
    return result;
  },

  /**
   * DES加密数据,根据公钥加密
   * @param { String } data 需要加密的数据
   * @return { String } 结果
   */
  securityDesEncryptFromKey(data) {
    const privateKeyStr = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCM5LSydRMf73HBtzQMukm7BgMAg8CaVq09BBR1wkmxudiO0r9PO0itKzLENwVjjDM4NNBBLBYSGAO1b4uMDMG1pTf/YmEuni+7Zvt+Y+HrVarJjOUpV06cyZp1yYfEktcwUJ9U/yQ9Jz2a+oS2Fubr27MuqUkpfIxTh9GQryTVtwIDAQAB';
    const key2 = new NodeRSA();
    key2.setOptions({ encryptionScheme: 'pkcs1' });
    key2.importKey(privateKeyStr, 'pkcs8-public');
    return key2.encrypt(data, 'base64');
  },
  /**
   * DES解密数据,根据私钥解密，对应securityDesEncryptFromKey 方法
   * @param { String } data 需要加密的数据
   * @return { String } 结果
   */
  securityDesDecryptFromKey(data) {
    const privateKeyStr = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIzktLJ1Ex/vccG3NAy6SbsGAwCDwJpWrT0EFHXCSbG52I7Sv087SK0rMsQ3BWOMMzg00EEsFhIYA7Vvi4wMwbWlN/9iYS6eL7tm+35j4etVqsmM5SlXTpzJmnXJh8SS1zBQn1T/JD0nPZr6hLYW5uvbsy6pSSl8jFOH0ZCvJNW3AgMBAAECgYAWV9qUBl7vDJDUsJHvhsdUgmKNfVdY4m/8oh4AgrwfFCLUm3U9QmCHHbeiSDtxivVAb5erDiu92NMVvce6gPdi8gESJefG9LNZW9bURy7bZ7aXSn8mra810beMmrYmqpOOTgNcQT696H9nhwObeSdTMO7GCyDUq85LX0Ln67Wh+QJBAPGMtGl8SkRDpvG6Hp1gHm6COMzBsy/d2H8wG+HEhqpGUCYldeRTBZs/PmorPnMCBM4AGdpYfX9zWj28KcrHKh0CQQCVUndcEHHZoaQCK5JrHn6Vep1JOqkY1iO3egippZmrU0x1aiyhmnshjRpqrxN3yISeKrglNFDu6Q9reko63BbjAkEAo3bkFMre+4mI7edVlo0YqxKHW9Ht8IPCYnhtNgEoXQ0OanJJcQXaMnC/TVwMfAoutDYPSNs/usOWm1a+NZNI5QJAEAkhJFPnxhVjxY/kU3ic43Sde4W/LxmgEE4crAtKq2lwppNWY6xxWLMMiTRwBMcV5t5zlBtALcf9je8+FYAZPQJBAIQfEEZBsze+HuW5CkF9np+GIFb0wYi1I3wzzCJYboxMVlHbEO9fxWou9fEAkZQl+DgmDGh2Ai4tP8sZdDIjytQ=';
    const key2 = new NodeRSA();
    key2.setOptions({ encryptionScheme: 'pkcs1' });
    key2.importKey(privateKeyStr, 'pkcs8-private');
    return key2.decrypt(data, 'utf8');
  },
};
